package dibujo;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Polygon;

import org.uc3m.ed.interfaz_grafica.ventana.VentanaPrincipal;


public class NodoEnvoltura {

	/**
	 * 
	 */
	private Graphics _grafico;
	
	/**
	 * 
	 */
	private int _posicionX;
	
	/**
	 * 
	 */
	private int _posicionY;
	
	/**
	 * 
	 */
	private int _anchoNodo;
	
	/**
	 * 
	 */
	private int _altoNodo;
	
	/**
	 * 
	 */
	private NodoDibujo _cima;
	
	
	/**
	 * @param grafico
	 * @param cima
	 */
	public NodoEnvoltura(Graphics grafico,NodoDibujo cima){
		_grafico=grafico;
		_anchoNodo=300;
		_altoNodo=40;
		_cima=cima;
	}
	
	/**
	 * 
	 */
	public void crearCabeceraCola()
	{	try{
			dibujarEnvoltura();
			dibujarEntrada();
			dibujarSalida();
			dibujarApuntamientoPrimero();
			dibujarApuntamientoCima();
		}catch(Exception e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::Cola::NodoEnvoltura ERROR::1\n   Se ha producido una Excepcion: "+e.toString());
		}catch(Error e){
			VentanaPrincipal.getConsola().escribirTextoError("CLASS::Cola::NodoEnvoltura ERROR::2\n   Se ha producido un Error: "+e.toString());
		}
	}

	/**
	 * 
	 */
	private void dibujarEnvoltura() throws Exception,Error{
		
		_grafico.setColor(Color.BLACK);
		_grafico.drawLine(_posicionX,_posicionY,_posicionX+_anchoNodo,_posicionY);
		_grafico.drawLine(_posicionX,_posicionY,_posicionX,getYEnvoltura());
		_grafico.drawLine(_posicionX+_anchoNodo,_posicionY,_posicionX+_anchoNodo,getYEnvoltura());
		
	}
	
	/**
	 * 
	 */
	private void dibujarApuntamientoPrimero() throws Exception,Error{
		
		_grafico.setColor(new Color (142,45,67));
		_grafico.drawLine(_posicionX-80,_posicionY,_posicionX-5,_posicionY);
		_grafico.fillPolygon(RellenarFlechaDerecha(new Point(_posicionX-10,_posicionY)));
		_grafico.drawString("Primero", _posicionX-70, _posicionY-2);
	}
	
	/**
	 * 
	 */
	private void dibujarApuntamientoCima() throws Exception,Error{
		
		_grafico.setColor(new Color (62,66,102));
		_grafico.drawLine(_posicionX+_anchoNodo+80,getYApuntamientoUltimo(),_posicionX+_anchoNodo+5,getYApuntamientoUltimo());
		_grafico.fillPolygon(RellenarFlechaIzquierda(new Point(_posicionX+_anchoNodo+10,getYApuntamientoUltimo())));
		_grafico.drawString("Cima", _posicionX+_anchoNodo+40, getYApuntamientoUltimo()-2);
		
	}
	

	/**
	 * 
	 */
	private void dibujarEntrada() throws Exception,Error{
		_grafico.setColor(new Color (91,131,88));
		_grafico.drawArc(_posicionX+(_anchoNodo/2)-60, getYEnvoltura()-80, 60, 80, 0, 100);
		_grafico.fillPolygon(RellenarFlechaAbajo(new Point(_posicionX+(_anchoNodo/2),getYEnvoltura()-40)));
		_grafico.drawString("Entrada", (_posicionX+(_anchoNodo/2))-60, getYEnvoltura()-84);
	}
	
	/**
	 * 
	 */
	private void dibujarSalida()throws Exception,Error {
		
		_grafico.setColor(new Color (91,131,88));
		_grafico.drawArc(_posicionX+(_anchoNodo/2)-30, _posicionY-10, 60, 80, 180, 100);
		_grafico.fillPolygon(RellenarFlechaDerecha(new Point(_posicionX+(_anchoNodo/2),_posicionY+70)));
		_grafico.drawString("Salida", (_posicionX+(_anchoNodo/2))-20, _posicionY+90);
	}
	
	/**
	 * @param centro
	 * @return
	 */
	private Polygon RellenarFlechaAbajo(Point centro)throws Exception,Error {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x+(radio*Math.sin(i*alfa))),(int)(centro.y+(radio*Math.cos(i*alfa))));
		
		return flecha;
	}
	
	/**
	 * @param centro
	 * @return
	 */
	private Polygon RellenarFlechaDerecha(Point centro)throws Exception,Error {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x+(radio*Math.cos(i*alfa))),(int)(centro.y+(radio*Math.sin(i*alfa))));
		
		return flecha;
	}
	
	/**
	 * @param centro
	 * @return
	 */
	private Polygon RellenarFlechaIzquierda(Point centro)throws Exception,Error {
		Polygon flecha= new Polygon();
		int lados=3;
		double alfa= ((2*Math.PI)/lados);
		int radio=10;
		
		for(int i=0;i<lados;i++)
			flecha.addPoint((int)(centro.x-(radio*Math.cos((i*alfa)))),(int)(centro.y-(radio*Math.sin(i*alfa))));
		
		return flecha;
	}
	
	
	
	
	//Metodos get and set
	
	/**
	 * @param posicionX
	 */
	public void setPosicionX(int posicionX) {
		_posicionX = posicionX;
	}
	
	/**
	 * @param posicionY
	 */
	public void setPosicionY(int posicionY) {
		_posicionY = posicionY;
	}
	
	/**
	 * @return
	 */
	public int getPosicionY() {
		return _posicionY;
	}
	
	/**
	 * @return
	 */
	public int getAnchoNodo() {
		return _anchoNodo;
	}
	
	/**
	 * @return
	 */
	public int getAltoNodo() {
		return _altoNodo;
	}
	
	/**
	 * @return
	 */
	private int getYEnvoltura()throws Exception,Error
	{
		int y;
		
		if (_cima==null)
			y=_posicionY-_altoNodo;
		else
			y=_cima.getPosicionY()-_altoNodo;
		
		return y;
	
	}
	
	/**
	 * @return
	 */
	private int getYApuntamientoUltimo()throws Exception,Error {
		int y;
		
		if (_cima==null)
			y=_posicionY;
		else
			y=_cima.getPosicionY();
		
		return y;
	}
}
